package com.fruit.common.jgpush;

import java.util.Map;

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.CIDResult;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

/**
 * 极光push工具类
 * 
 * @author Administrator
 *
 */
public class PushUtils {
	// AppKey
	protected static final String APP_KEY = "783e13240263efd5d9ef3bf8";
	// 主密钥
	protected static final String MASTER_SECRET = "f51ff98fac5f31b3c882d769";
	// 通知标题
	public static final String TITLE = "";
	// 通知内容
	public static final String ALERT = "";
	// 消息内容
	public static final String MSG_CONTENT = "";
	// 设备标识
	public static final String REGISTRATION_ID = "";
	// 标签
	public static final String TAG = "";
	// JPushClient
	public static JPushClient jpushClient = null;
	// 初始化jpushClient
	static {
		ClientConfig clientConfig = ClientConfig.getInstance();
		jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, clientConfig);
	}

	/**
	 * 推送消息
	 * 
	 * @param payload
	 *            推送消息体
	 * 
	 * @return 0推送失败 1推送成功
	 */
	public static PushResult sendPush(PushPayload payload)  throws APIConnectionException, APIRequestException{
			PushResult result = jpushClient.sendPush(payload);
		return result;
	}

	/**
	 * 构建push消息体 所有平台和所有用户
	 * 
	 * @param alert
	 *            推送内容(必填)
	 * @return PushPayload
	 */
	public static PushPayload buildPushObject_all_all_alert(String alert) {
		return PushPayload.alertAll(alert);
	}

	/**
	 * 通过别名构建push消息体 推送到所有平台
	 * 
	 * @param alias
	 *            别名
	 * @param alert
	 *            推送内容(必填)
	 * @return PushPayload
	 */
	public static PushPayload buildPushObject_all_alias_alert(String[] alias, String alert) {
		return PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.alias(alias))
				.setNotification(Notification.alert(alert)).build();
	}

	/**
	 * 通过标签构建push消息体 推送到android平台
	 * 
	 * @param tags
	 *            标签
	 * @param alert
	 *            推送内容(必填)
	 * @param title
	 *            标题
	 * @return PushPayload
	 */
	public static PushPayload buildPushObject_android_tag_alertWithTitle(String[] tags, String alert, String title) {
		return PushPayload.newBuilder().setPlatform(Platform.android()).setAudience(Audience.tag(tags))
				.setNotification(Notification.android(alert, title, null)).build();
	}

	/**
	 * 构建push消息体 android_ios 所有人
	 * 
	 * @param alert
	 *            推送内容(必填)
	 * @param title
	 *            推送标题(可选)将代替app名称
	 * @param extras
	 *            此字段为透传字段，不会显示在通知栏。 用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
	 * @return 返回推送对象
	 */
	public static PushPayload buildPushObject_android_and_ios(String alert, String title,
			Map<String, String> extras) {
		return PushPayload.newBuilder()
				// 指定要推送的平台
				.setPlatform(Platform.android_ios())
				// 指定推送的接收对象，all代表所有人，也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的regId
				.setAudience(Audience.all())
				// jpush的通知，android的由jpush直接下发，iOS的由apns服务器下发，Winphone的由mpns下发
				.setNotification(Notification.newBuilder()
						// 设置通知内容（必填）
						.setAlert(alert)
						// 指定当前推送的android通知
						.addPlatformNotification(AndroidNotification.newBuilder()
								// 设置通知标题（可选）
								.setTitle(title)
								// 此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
								.addExtras(extras).build())
						// 指定当前推送的iOS通知
						.addPlatformNotification(IosNotification.newBuilder()
								// 传一个IosAlert对象，指定apns title、title、subtitle等
								.setAlert(alert)
								// 直接传alert
								// 此项是指定此推送的badge（应用角标）自动加1
								.incrBadge(1)
								// 此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
								.addExtras(extras).build())
						.build())
				// .setOptions(Options.newBuilder()
				// .setApnsProduction(true)
				// .build())
				.build();
	}

	/**
	 * 建立以唯一设备标识符推送的对象
	 * 
	 * @param regId
	 *            唯一设备标识
	 * @param alert
	 *            通知内容
	 * @param title
	 *            通知标题
	 * @param extras
	 *            扩展字段
	 * @return 返回推送对象
	 */
	public static PushPayload buildPushWithRegistrationId(String regId,String alert,
			String title, Map<String, String> extras) {
		return PushPayload.newBuilder()
				// 指定要推送的平台，all代表当前应用配置了的所有平台，也可以传android等具体平台
				.setPlatform(Platform.all())
				// 指定推送的接收对象，all代表所有人，也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的regId
				.setAudience(Audience.registrationId(regId))
				// jpush的通知，android的由jpush直接下发，iOS的由apns服务器下发，Winphone的由mpns下发
				.setNotification(Notification.newBuilder()
						// 指定当前推送的android通知
						.addPlatformNotification(AndroidNotification.newBuilder()
								.setAlert(alert) // 设置通知内容（必填）
								.setTitle(title) // 设置通知标题（可选）
								// 此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
								.addExtras(extras).build())

						// 指定当前推送的iOS通知
						.addPlatformNotification(IosNotification.newBuilder()
								// 传一个IosAlert对象，指定apns title、title、subtitle等
								.setAlert(alert)
								// 直接传alert
								// 此项是指定此推送的badge（应用角标）自动加1
								.incrBadge(1)
								// 此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
								.addExtras(extras).build())
						.build())
				.build();
	}
	/**
	 * 获取cid list
	 * @return
	 * @throws APIRequestException 
	 * @throws APIConnectionException 
	 */
	public static CIDResult getCidList() throws APIConnectionException, APIRequestException {
		CIDResult result = jpushClient.getCidList(3, "push");
		return result;
	}

}
